package com.example.canvastouch2;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CanvasView extends View {
	private ArrayList<PathGroup> allPath;		//	全ての描画情報
	private PathGroup group;					//	現在の描画情報
	int curColor = Color.BLACK;					//	現在の色
	int curWidth = 10;							//	現在の幅

	public CanvasView(Context context) {
		super(context);
		init();
	}

	public CanvasView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public CanvasView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}
	
	/**
	 * 	allPath	全ての描画情報を保存する配列を生成する
	 * 	group	現在（これから）の描画情報を生成し、保存する。
	 */
	private void init() {
		allPath = new ArrayList<PathGroup>();
		group = new PathGroup(curColor, curWidth);
		allPath.add(group);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//	背景を塗りつぶす
		canvas.drawColor(Color.WHITE);
		
		//	全ての描画情報を元に描画する
		for ( int i=0 ; i<allPath.size() ; i++ ) {
			PathGroup pathInfo = allPath.get(i);
			canvas.drawPath(pathInfo.path, pathInfo.p);
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		float x = event.getX();
		float y = event.getY();
		
		switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				group.path.moveTo(x, y);
				break;
			case MotionEvent.ACTION_MOVE:
				group.path.lineTo(x, y);
				break;
			case MotionEvent.ACTION_UP:
				group.path.lineTo(x, y);
				break;
		}
		invalidate();					//	再表示する
		return true;
	}

	/**
	 * 	全ての描画情報をクリアし、初期設定する
	 * 	再表示（クリア）する
	 */
	public void clear() {
		allPath.clear();
		group = new PathGroup(curColor, curWidth);
		allPath.add(group);
		invalidate();
	}
	
	/**
	 * 	これから描画する色を設定する
	 * 
	 * 	@param color		これから描画する色
	 */
	public void setColor(int color) {
		group = new PathGroup(curColor, curWidth);	//	現在（これから）の描画情報を生成
		allPath.add(group);							//	保存

		group.p.setColor(color);					//	線の色を変更
		curColor = color;
	}
	
	/**
	 * 	これから描画する線の幅を設定する
	 * 
	 * 	@param width		これから描画する線の幅
	 */
	public void setWidth(int width) {
		group = new PathGroup(curColor, curWidth);	//	現在（これから）の描画情報を生成
		allPath.add(group);							//	保存

		group.p.setStrokeWidth(width);				//	線の幅を変更
		curWidth = width;
	}
}
